package org.raymond.iworks.study.basic.designpattern.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author raymond
 * @version V1.0
 * @Description: TODO
 */
public class ProxyFactory {
    private Object target;
    public ProxyFactory(Object target){
        this.target = target;
    }

    public Object getProxyInstance(){
        /**
         * 1, classloader: 指定当前目标对象使用的类加载器,获取加载器的方法固定
         * 2, interfaces: 目标对象实现的接口类型,使用泛型方式确认类型
         * 3, invocationHandler: 事件处理,执行目标对象的方法时,会触发事件处理方法,会把当前执行的目标对象方法作为参数
         */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), (proxy, method, args)->{
                    System.out.println("Jdk代理开始");
                    Object returnVal = method.invoke(target, args);
                    System.out.println("Jdk代理执行方法完毕");
                    return returnVal;
                });
    }
}
